/**
 * WanlShop状态管理器 - 系统更新 - 后续版本更新
 *
 * @ author 深圳前海万联科技有限公司 <wanlshop@i36k.com>
 * < 程序仅用作FastAdmin付费插件API测试使用，未经版权所有权人书面许可，不能用于商业用途！>
 * @ link http://www.wanlshop.com
 * @ 2020年9月29日19:00:46
 * @ version 1.0.0
 **/
import api from '../../common/request/request';
import config from '../../common/config/config';

export default {
  namespaced: true,
  // 储存数据
  state: {
    update: false,
    data: {},
    link: {},
    download: {
      path: null,
      start: false,
      install: false,
      progress: 0,
      totalBytesWritten: 0,
      totalBytesExpectedToWrite: 0,
    },
    task: null,
  },
  // 修改数据
  mutations: {
    edit(state, { data, index }) {
      state[index] = data;
    },
  },
  actions: {
    async update({ commit, dispatch }) {
      // #ifdef MP
      const mp = uni.getUpdateManager();
      // 请求完新版本信息的回调
      mp.onCheckForUpdate(res => {
        config.debug ? console.log(res.hasUpdate) : '';
      });
      mp.onUpdateReady(res => {
        // 新的版本已经下载好，调用 applyUpdate 应用新版本并重启
        uni.showModal({
          title: '更新提示',
          content: '新版本已经准备好，是否重启应用？',
          success(show) {
            if (show.confirm) {
              mp.applyUpdate();
            }
          },
        });
      });
      mp.onUpdateFailed(res => {
        config.debug ? console.log('新的版本下载失败') : '';
      });
      // #endif

      // #ifdef APP-PLUS
      let storage = uni.getStorageSync('wanlshop:update');
      console.log(' 检测客户端更新========>', storage);
      if (!storage.ignore) {
        api.get({
          url: '/wanlshop/common/update',
          success: res => {
            if (res !== null) {
              // 获取本地缓存
              console.log(
                'version',
                config.versionCode,
                res.versionCode,
                Number(config.versionCode) !== Number(res.versionCode),
              );
              if (Number(config.versionCode) !== Number(res.versionCode)) {
                let link = false;
                // 写入全局数据
                res.content = res.content.replace(/(\r\n)|(\n)/g, '<br>');
                commit('edit', { data: res, index: 'data' });
                // 下载链接
                if (plus.os.name.toLowerCase() === 'ios') {
                  if (res.iosLink && res.iosLink !== '') {
                    commit('edit', {
                      data: {
                        url: config.cdnurl + res.iosLink,
                        type: res.iosLink.match(RegExp(/.wgt/)) ? 'wgt' : 'url',
                      },
                      index: 'link',
                    });
                    link = true;
                  }
                } else {
                  if (res.androidLink && res.androidLink !== '') {
                    commit('edit', {
                      data: {
                        url: config.cdnurl + res.androidLink,
                        type: res.androidLink.match(RegExp(/.wgt/)) ? 'wgt' : 'url',
                      },
                      index: 'link',
                    });
                    link = true;
                  }
                }
                // 更新方式
                res.enforce === 1
                  ? link && dispatch('download')
                  : link && commit('edit', { data: true, index: 'update' });
              } else {
                // 如果有缓存删除
                if (storage.path) {
                  uni.removeSavedFile({
                    filePath: storage.path,
                    success: res => {
                      uni.removeStorageSync('wanlshop:update');
                    },
                  });
                }
              }
            } else {
              config.debug ? console.log('暂未发现任何更新版本') : '';
            }
          },
        });
      }
      // #endif
    },
    async download({ state, commit, dispatch }) {
      // #ifdef APP-PLUS
      let storage = uni.getStorageSync('wanlshop:update');
      let link = state.link;
      let download = state.download;
      // 判断是否下载过，下载过安装
      if (storage.path) {
        config.debug ? console.log('已经下载过，未安装') : '';
        commit('edit', { data: false, index: 'update' });
        if (link.type == 'wgt') {
          download.path = storage.path;
          if (state.data.enforce === 1) {
            dispatch('install');
          } else {
            uni.showModal({
              title: '更新尚未完成',
              content: '没有完成安装或安装的版本号不是最新！是否要继续安装更新包呢？',
              success: res => {
                if (res.confirm) {
                  dispatch('install');
                }
              },
            });
          }
        } else if (link.type == 'url') {
          plus.runtime.openURL(link.url);
          // dispatch('downloadApk' , link.url);
        }
      } else {
        // 判断下载类型
        if (link.type == 'wgt') {
          download.start = true;
          // 创建下载任务对象
          state.task = uni.downloadFile({
            url: link.url,
            success: res => {
              if (res.statusCode === 200) {
                // 保存下载的安装包
                uni.saveFile({
                  tempFilePath: res.tempFilePath,
                  success: file => {
                    // 本地缓存
                    uni.setStorage({
                      key: 'wanlshop:update',
                      data: {
                        path: file.savedFilePath,
                        ignore: false,
                      },
                    });
                    // 保存地址
                    download.path = file.savedFilePath;
                    // 任务完成，关闭下载任务
                    state.task.abort();
                    state.task = null;
                    download.start = false;
                    // 进行安装
                    dispatch('install');
                  },
                });
              } else {
                uni.showToast({
                  title: `有更新，但更新文件异常：${link.url}`,
                  icon: 'none',
                  duration: 5000,
                });
              }
            },
          });
          // 进度条更新
          state.task.onProgressUpdate(res => {
            // 下载进度百分比
            download.progress = res.progress;
            // 已经下载的数据长度，单位 Bytes
            download.totalBytesWritten = res.totalBytesWritten;
            // 预期需要下载的数据总长度，单位 Bytes
            download.totalBytesExpectedToWrite = res.totalBytesExpectedToWrite;
          });
        } else if (link.type == 'url') {
          // 弹出更新
          config.debug ? console.log('弹出更新') : '';
          // plus.runtime.openURL(link.url);
          dispatch('downloadApk', link.url);
        }
      }
      // #endif
    },
    async install({ state, commit }) {
      config.debug ? console.log('开始安装') : '';
      // #ifdef APP-PLUS
      let download = state.download;
      let force = state.update ? {} : { force: true };
      // 更新状态
      download.install = true;
      // 安装更新
      plus.runtime.install(
        download.path,
        force,
        function () {
          // 更新状态
          commit('edit', { data: false, index: 'update' });
          download.install = false;
          // 更新提示
          uni.showModal({
            title: '升级成功',
            content: '应用将重启以完成更新',
            showCancel: false,
            complete: () => {
              plus.runtime.restart();
            },
          });
        },
        function (e) {
          // 更新状态
          download.install = false;
          uni.showToast({
            title: `安装失败：${e.message}`,
            icon: 'none',
            duration: 8000,
          });
        },
      );
      // #endif
    },
    // 忽略升级
    async ignore({ state, commit }) {
      // 本地缓存
      uni.setStorage({
        key: 'wanlshop:update',
        data: {
          path: null,
          ignore: true,
        },
      });
      commit('edit', { data: false, index: 'update' });
    },

    async downloadApk({ state, commit }, upgradeUrl) {
      // 新建下载任务  { 文件资源地址 ，下载任务的参数 ， 下载任务完成回调函数  }
      var dtask = plus.downloader.createDownload(upgradeUrl, {}, (download, status) => {
        uni.showToast({
          title: '下载完成',
          mask: false,
          duration: 1000,
        });
        // 下载完成
        if (status == 200) {
          // convertLocalFileSystemURL 将本地URL路径转换成平台绝对路径
          // install 安装应用   { 文件路径, 应用安装设置的参数,正确安装后的回调,安装失败的回调 }
          plus.runtime.install(
            plus.io.convertLocalFileSystemURL(download.filename),
            {
              // force: false  //
              // force: (Boolean 类型 )是否强制安装
              // true:表示强制安装，不进行版本号的校验；
              // false 则需要版本号校验，如果将要安装应用的版本号不高于现有应用的版本号则终止安装，并返回安装失败。
              // 仅安装wgt和wgtu时生效，默认值 false。
            },
            e => {
              if (upgradeUrl.indexOf('.apk') == -1) {
                //安装 wgt 资源包成功后，必须执行 plus.runtime.restart()，否则新的内容并不会生效。
                plus.runtime.restart(); //用热重启，重新启动进入首页。
              }
            },
            error => {
              uni.showToast({
                title: '安装失败[' + error.code + ']：' + error.message,
                mask: false,
                icon: 'none',
                duration: 2000,
              });
              // plus.nativeUI.alert( "安装apk文件失败[" + error.code + "]：" + error.message ); // 原生弹框
            },
          );
        } else {
          uni.showToast({
            title: '更新失败-02',
            mask: false,
            icon: 'none',
            duration: 2000,
          });
        }
      });
      try {
        dtask.start(); // 开启下载的任务
        var prg = 0;
        var showLoading = plus.nativeUI.showWaiting('正在下载'); //创建一个showWaiting对象
        // 给下载任务设置一个监听 并根据状态  做操作
        dtask.addEventListener('statechanged', function (task, status) {
          // console.log( ' ========>', JSON.parse( JSON.stringify( task, ) ) );
          switch (task.state) {
            case 1:
              showLoading.setTitle('正在下载');
              break;
            case 2:
              showLoading.setTitle('已连接到服务器,正在下载');
              break;
            case 3:
              prg = parseInt((parseFloat(task.downloadedSize) / parseFloat(task.totalSize)) * 100);
              if (isSchedule) {
                showLoading.setTitle('正在下载' + prg + '%  ');
              }
              break;
            case 4:
              plus.nativeUI.closeWaiting(); //关闭弹出框
              //下载完成
              break;
          }
        });
      } catch (err) {
        plus.nativeUI.closeWaiting(); //关闭弹出框
        uni.showToast({
          title: '更新失败-03',
          mask: false,
          icon: 'none',
          duration: 2000,
        });
      }
    },
  },
};
